package org.xiaov.core.bean;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xiaov.core.string.StringHelper;

import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

/**
 * @description: 操作bean的帮助类
 * @author: xiaovcloud
 * @date: 2021/1/17 14:50
 */
public class BeanHelper {
    private static final Logger log = LoggerFactory.getLogger(BeanHelper.class);

    /**
     * 判断对象是否为空
     *
     * @param obj 需要判断的对象
     * @return 是否为空
     */
    @SuppressWarnings("rawtypes")
    public static boolean isEmpty(Object obj) {
        if (null == obj) {
            return true;
        } else if (obj instanceof CharSequence) {
            return ((CharSequence) obj).length() == 0;
        } else if (obj instanceof Collection) {
            return ((Collection) obj).isEmpty();
        } else if (obj instanceof Map) {
            return ((Map) obj).isEmpty();
        } else if (obj.getClass().isArray()) {
            return Array.getLength(obj) == 0;
        }
        return false;
    }

    /**
     * 判断对象是否不为空
     *
     * @param obj 需要判断的对象
     * @return 是否不为空
     */
    public static boolean isNotEmpty(Object obj) {
        return !isEmpty(obj);
    }

    /**
     * 对象转map
     *
     * @param obj 需要转换的对象
     * @return 转换后的map
     */
    public static Map<String, Object> toMap(Object obj) {

        Map<String, Object> map = new HashMap<>(16);
        // 获取f对象对应类中的所有属性域
        Field[] fields = obj.getClass().getDeclaredFields();
        for (Field field : fields) {
            String varName = field.getName();
            // 将key置为小写，默认为对象的属性
            varName = varName.toLowerCase();
            try {
                // 获取原来的访问控制权限
                boolean accessFlag = field.isAccessible();
                // 修改访问控制权限
                field.setAccessible(true);
                // 获取在对象f中属性fields[i]对应的对象中的变量
                Object o = field.get(obj);
                if (o != null) {
                    map.put(varName, o.toString());
                }
                // 恢复访问控制权限
                field.setAccessible(accessFlag);
            } catch (IllegalArgumentException | IllegalAccessException ex) {
                ex.printStackTrace();
            }
        }
        return map;
    }

    /**
     * 将value值转为实体类中字段类型匹配的方法
     *
     * @param value          需要转换的value
     * @param fieldTypeClass 转换的类型
     * @return 返回值
     */
    public static Object convertValType(Object value, Class<?> fieldTypeClass) {
        Object retVal;
        if (Long.class.getName().equals(fieldTypeClass.getName())
                || long.class.getName().equals(fieldTypeClass.getName())) {
            retVal = Long.parseLong(value.toString());
        } else if (Integer.class.getName().equals(fieldTypeClass.getName())
                || int.class.getName().equals(fieldTypeClass.getName())) {
            retVal = Integer.parseInt(value.toString());
        } else if (Float.class.getName().equals(fieldTypeClass.getName())
                || float.class.getName().equals(fieldTypeClass.getName())) {
            retVal = Float.parseFloat(value.toString());
        } else if (Double.class.getName().equals(fieldTypeClass.getName())
                || double.class.getName().equals(fieldTypeClass.getName())) {
            retVal = Double.parseDouble(value.toString());
        } else {
            retVal = value;
        }
        return retVal;
    }

    /**
     * 检查对象的所有字段是否为空
     *
     * @param obj 检测的对象
     * @return 是否不为空
     */
    public static boolean checkAllFiled(Object obj) {
        if (obj == null) {
            throw new NullPointerException("传入对象为空");
        }

        Class<?> cls = obj.getClass();
        Field[] fields = cls.getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);
            try {
                if (field.get(obj) == null || StringHelper.isEmpty(field.get(obj).toString())) {
                    throw new NullPointerException("对象【" + obj.getClass().getName() + "】的字段【" + field.getName() + "】为空");
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return true;
    }

    /**
     * 如果第一个值为空，则返回第二个值
     * @param obj
     * @param value
     * @param <T>
     * @return
     */
    public static <T> T val(T obj, T value) {
        if (obj == null) {
            return value;
        }
        return obj;
    }

}
